package ventanas;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import com.toedter.calendar.JDateChooser;
import controladores.ControladorABMMedico;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.ListModel;
import javax.swing.UIManager;
import javax.swing.JButton;
import negocio.Especialidad;
import negocio.Medico;
import negocio.Sistema;
import java.awt.Insets;
import java.util.List;
import javax.swing.ListSelectionModel;

public class VentanaABMMedico extends JFrame {
	private static final long serialVersionUID = 1L;
	private JTextField txtNombre;
	private JTextField txtApellido;
	private JTextField txtDireccion;
	private JTextField txtTelefono;
	private JTextField txtMatricula;
	private JDateChooser dcFechaNacimiento;
	private JList<Especialidad> listEspecialidades;
	private JList<Especialidad> listMisEspecialidades;
	private ListModel<Especialidad> modelListEspecialidades;
	private ListModel<Especialidad> modelListMisEspecialidades;
	private final JLabel lblMensaje = new JLabel("");
	private JButton btnIda;
	private JButton btnCargarAgenda;
	private JButton btnDarDeBaja;
	private JButton btnVuelta;
	private JCheckBox chckbxEditarDatos;
	private JButton btnAceptar;
	private JButton btnCancelar;
	private Sistema sistema;
	private ControladorABMMedico controlador;
	private Medico medico;
	
	public VentanaABMMedico(Medico m) {	
		this.sistema=Sistema.obtenerInstancia();
		this.controlador= new ControladorABMMedico(this, m);
		this.medico=m;
		initGUI();
		agregarListeners();
		cargarDatosPrevios();
	}
	
	public void initGUI(){
		modelListMisEspecialidades = new DefaultListModel<Especialidad>();
		modelListEspecialidades = new DefaultListModel<Especialidad>();
	
		setTitle("M\u00E9dico");
		getContentPane().setLayout(null);
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "Datos del m\u00E9dico", TitledBorder.LEFT, TitledBorder.TOP, null, null));
		panel.setBounds(10, 31, 404, 265);
		getContentPane().add(panel);
		panel.setLayout(null);
		JLabel lblNombre = new JLabel("Nombre");
		lblNombre.setBounds(10, 24, 58, 14);
		panel.add(lblNombre);
		txtNombre = new JTextField();
		txtNombre.setBounds(78, 21, 97, 20);
		panel.add(txtNombre);
		txtNombre.setColumns(10);
		JLabel lblApellido = new JLabel("Apellido");
		lblApellido.setBounds(213, 24, 48, 14);
		panel.add(lblApellido);
		txtApellido = new JTextField();
		txtApellido.setBounds(283, 21, 111, 20);
		panel.add(txtApellido);
		txtApellido.setColumns(10);
		JLabel label = new JLabel("Direcci\u00F3n");
		label.setBounds(10, 56, 58, 14);
		panel.add(label);
		txtDireccion = new JTextField();
		txtDireccion.setColumns(10);
		txtDireccion.setBounds(78, 52, 97, 20);
		panel.add(txtDireccion);
		JLabel label_1 = new JLabel("Tel\u00E9fono");
		label_1.setBounds(213, 58, 60, 14);
		panel.add(label_1);
		txtTelefono = new JTextField();
		txtTelefono.setColumns(10);
		txtTelefono.setBounds(283, 53, 111, 20);
		panel.add(txtTelefono);
		JLabel lblMatrcula = new JLabel("Matr\u00EDcula");
		lblMatrcula.setBounds(10, 87, 58, 14);
		panel.add(lblMatrcula);
		txtMatricula = new JTextField();
		txtMatricula.setBounds(78, 84, 97, 20);
		panel.add(txtMatricula);
		txtMatricula.setColumns(10);
		dcFechaNacimiento = new JDateChooser();
		dcFechaNacimiento.setBounds(283, 81, 111, 20);
		panel.add(dcFechaNacimiento);
		JLabel lblFNacimiento = new JLabel("F. Nacimiento");
		lblFNacimiento.setBounds(197, 87, 76, 14);
		panel.add(lblFNacimiento);
		listEspecialidades = new JList<Especialidad>();
		listEspecialidades.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		listEspecialidades.setBounds(33, 125, 142, 90);
		panel.add(listEspecialidades);
		listEspecialidades.setBorder(new TitledBorder(null, "Especialidades", TitledBorder.LEFT, TitledBorder.TOP, null, null));
		listEspecialidades.setModel(modelListEspecialidades);
	
		listMisEspecialidades = new JList<Especialidad>();
		listMisEspecialidades.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		listMisEspecialidades.setBounds(252, 125, 142, 90);
		panel.add(listMisEspecialidades);
		listMisEspecialidades.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Mis Especialidades", TitledBorder.LEFT, TitledBorder.TOP, null, null));
		listMisEspecialidades.setModel(modelListMisEspecialidades);
		btnIda = new JButton("-->");
		btnIda.setMargin(new Insets(2, 8, 2, 8));
		btnIda.setBounds(197, 138, 43, 23);
		panel.add(btnIda);
		btnCargarAgenda = new JButton("Configurar Agenda");
		btnCargarAgenda.setBounds(33, 226, 152, 23);
		panel.add(btnCargarAgenda);
		btnDarDeBaja = new JButton("Dar de baja");
		btnDarDeBaja.setBounds(213, 226, 113, 23);
		panel.add(btnDarDeBaja);
		btnVuelta = new JButton("<--");
		btnVuelta.setMargin(new Insets(2, 8, 2, 8));
		btnVuelta.setBounds(197, 172, 43, 23);
		panel.add(btnVuelta);
		chckbxEditarDatos = new JCheckBox("Modificar datos del m\u00E9dico");
		chckbxEditarDatos.setBounds(6, 7, 216, 23);
		getContentPane().add(chckbxEditarDatos);
		btnAceptar = new JButton("Aceptar");
		btnAceptar.setBounds(45, 352, 149, 23);
		getContentPane().add(btnAceptar);
		btnCancelar = new JButton("Cancelar");
		btnCancelar.setBounds(219, 352, 123, 23);
		getContentPane().add(btnCancelar);
		lblMensaje.setBounds(20, 297, 382, 42);
		getContentPane().add(lblMensaje);
		this.setSize(452, 444);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}
	
	private void cargarDatosPrevios() {
		if (medico == null){
			chckbxEditarDatos.setVisible(false);
			setearEditabilidadCampos(true);
			btnDarDeBaja.setEnabled(false);
		}else{
			txtNombre.setText(medico.getNombre());
			txtApellido.setText(medico.getApellido());
			txtDireccion.setText(medico.getDireccion());
			txtTelefono.setText(medico.getTelefono());
			txtMatricula.setText(medico.getMatricula());
		
			if(medico.getFechaNacimiento()!=null)
				dcFechaNacimiento.setDate(medico.getFechaNacimiento().getTime());
			
			setearEditabilidadCampos(false);
		}
		cargarListas();
		
	}

	private void cargarListas() {		
		DefaultListModel<Especialidad> modeloMisEsp = (DefaultListModel<Especialidad>) listMisEspecialidades.getModel();
		
		if (medico != null){
			modeloMisEsp = new DefaultListModel<Especialidad>();
			List<Especialidad> especialidades = medico.getEspecialidades();
			
			for (Especialidad esp : especialidades) {
				modeloMisEsp.addElement(esp);
			}
			listMisEspecialidades.setModel(modeloMisEsp);
			listMisEspecialidades.revalidate();
		}
		
		List<Especialidad> especialidades =  sistema.obtenerEspecialidades();
		DefaultListModel<Especialidad> modeloEsp = (DefaultListModel<Especialidad>) listEspecialidades.getModel();
		modeloMisEsp = (DefaultListModel<Especialidad>) listMisEspecialidades.getModel();
		boolean estaContenida = false;
		
		for (Especialidad esp : especialidades) {
			estaContenida = false;
			for(int i=0; i<modeloMisEsp.getSize() && !estaContenida; i++){
				if(esp.equals(modeloMisEsp.get(i))){
					estaContenida = true;
				}
			}
			if(!estaContenida){
				modeloEsp.addElement(esp);
			}
		}
		listEspecialidades.setModel(modeloEsp);
		listEspecialidades.revalidate();	
	}

	public void actualizarListas (){
		listEspecialidades.revalidate();
		listMisEspecialidades.revalidate();
	}

	public void agregarListeners(){
		btnAceptar.addActionListener(controlador);
		btnCancelar.addActionListener(controlador);
		btnIda.addActionListener(controlador);
		btnVuelta.addActionListener(controlador);
		btnCargarAgenda.addActionListener(controlador);
		btnDarDeBaja.addActionListener(controlador);
		chckbxEditarDatos.addActionListener(controlador);
	}
	
	public void setearEditabilidadCampos(boolean val){
		btnAceptar.setEnabled(val);
		btnIda.setEnabled(val);
		btnVuelta.setEnabled(val);
		btnCargarAgenda.setEnabled(val);
		txtNombre.setEnabled(val);
		txtApellido.setEnabled(val);
		txtDireccion.setEnabled(val);
		txtTelefono.setEnabled(val);
		txtMatricula.setEnabled(val);
		dcFechaNacimiento.setEnabled(val);
		listEspecialidades.setEnabled(val);
		listMisEspecialidades.setEnabled(val);
	}
	
	//Getters and Setters
	public JTextField getTxtNombre() {
		return txtNombre;
	}

	public JTextField getTxtApellido() {
		return txtApellido;
	}

	public JTextField getTxtDireccion() {
		return txtDireccion;
	}

	public JTextField getTxtTelefono() {
		return txtTelefono;
	}

	public JTextField getTxtMatricula() {
		return txtMatricula;
	}
	
	public JDateChooser getDcFechaNacimiento() {
		return dcFechaNacimiento;
	}

	public JList<Especialidad> getListEspecialidades() {
		return listEspecialidades;
	}

	public void setListEspecialidades(JList<Especialidad> listEspecialidades) {
		this.listEspecialidades = listEspecialidades;
	}

	public JList<Especialidad> getListMisEspecialidades() {
		return listMisEspecialidades;
	}

	public void setListMisEspecialidades(JList<Especialidad> listMisEspecialidades) {
		this.listMisEspecialidades = listMisEspecialidades;
	}
	
	public JButton getBtnIda() {
		return btnIda;
	}

	public JButton getBtnCargarAgenda() {
		return btnCargarAgenda;
	}

	public JButton getBtnDarDeBaja() {
		return btnDarDeBaja;
	}

	public JCheckBox getChckbxEditarDatos() {
		return chckbxEditarDatos;
	}

	public JButton getBtnAceptar() {
		return btnAceptar;
	}

	public JButton getBtnCancelar() {
		return btnCancelar;
	}

	public JButton getBtnVuelta() {
		return btnVuelta;
	}

	public JLabel getLblMensaje() {
		return lblMensaje;
	}
}
 
